﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Chap05;

//namespace CSharpFunctionPointer
//{
//    class Program
//    {
//        delegate void FunctionPointer(string str);

//        static void Main(string[] args)
//        {
//            FunctionPointer fp = HelloWorld;
//            fp("Hello World!");
//        }

//        static void HelloWorld(string str)
//        {
//            Console.WriteLine(str);
//            Console.ReadLine();
//        }
//    }
//}

//namespace CSharpAnonymousDelegate
//{
//    class Program
//    {
//        delegate void FunctionPointer(string str);

//        //static void Main(string[] args)
//        //{
//        //    FunctionPointer fp = delegate(string s)
//        //    {
//        //        Console.WriteLine(s);
//        //        Console.ReadLine();
//        //    };

//        //    fp("Hello World!");
//        //}

//        static void Main(string[] args)
//        {
//            FunctionPointer fp = (s) => 
//            {
//                Console.WriteLine(s);
//                Console.ReadLine();
//            };

//            fp("Hello World!");
//        }
//    }
//}

//namespace LamdaExpressionWithGenericAction
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Action<string> fp = 
//                s => Console.WriteLine(s);

//            fp("Hello World!");
//            Console.ReadLine();
//        }
//    }
//}

//namespace AutomaticProperty
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            IronChef Batali = new IronChef
//            {
//                Name = "Mario Batali",
//                Specialty = "Italian"
//            };
//            Console.WriteLine(Batali.Name);
//            Console.ReadLine();
//        }
//    }

//    public class IronChef
//    {
//        public string Name { get; set; }
//        public string Specialty { get; set; }
//    }
//}

//namespace ExplicitLambdaArguments
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Func<int, int, int> add =
//                (int x, int y) => x + y;
//            Console.WriteLine(add(3, 4));
//            Console.ReadLine();
//        }
//    }
//}

//namespace LambdaExpressAction
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Action<string, TextWriter> print =
//                (s, writer) => writer.WriteLine(s);
//            print("Console", Console.Out);
//            StreamWriter stream = File.AppendText("C:\\temp\text.txt");
//            stream.AutoFlush = true;
//            print("File", stream);
//            Console.ReadLine();
//        }
//    }
//}

//namespace ForEachWithActionLambda
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            Action<double> print = 
//                amount => Console.WriteLine("{0:c}", amount);
//            Action<double> michiganSalesTax =
//                amount => print(amount * 1.06);

//            var amounts = new double[]{
//                10.36, 12.00, 134
//            };

//            Array.ForEach<double>(amounts, michiganSalesTax);

//            Console.ReadLine();
//        }
//    }
//}

//namespace Searching
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            var recipes = new[]{
//                "Crepes Florentine", "Shrimp Che Paul",
//                "Beef Burgundy", "Rack of Lamb",
//                "Tacos", "Rosemary Roasted Chicken",
//                "Juevos Rancheros", "Buffalo Chicken Nachos"};

//            var results = recipes.Where(
//                s => s.Contains("Chicken"));

//            Array.ForEach<string>(results.ToArray<string>(),
//                s => Console.WriteLine(s));
//            Console.ReadLine();
//        }
//    }
//}

//namespace FindingNumbers
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            List<int> fiboList = new List<int>();
//            fiboList.AddRange(
//                new[] { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 });

//            Predicate<int> match = n => n % 2 == 1;
//            var odds = fiboList.FindAll(match);
//            //var odds2 = fiboList.Where(n => n % 2 == 1);

//            ObjectDumper.Write(odds);
//            //ObjectDumper.Write(odds2);
//            Console.ReadLine();
//        }
//    }
//}

//namespace SelectLambda
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            var numbers = new int[] { 1, 2, 3, 4, 5, 6 };
//            foreach (var result in numbers.Select(n => new { Number = n, IsEven = n % 2 == 0 }))
//                Console.WriteLine(result);

//            Console.ReadLine();
//        }
//    }
//}

//namespace WhereLambda
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            var words = new string[] { "Drop", "Dead", "Fred" };
//            var hasDAndE = words.Where(s => s.Contains('D') && s.Contains('e')).Select(s => new { FirstLetter = s.Substring(0, 1), Word = s });

//            foreach (var s in hasDAndE)
//            {
//                Console.WriteLine(s);
//            }
//            Console.ReadLine();
//        }
//    }
//}

//namespace OrderByLambda
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            var numbers = new int[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 10 };
//            IEnumerable<int> ordered = numbers.OrderBy(n => n);

//            foreach (var num in ordered)
//                Console.WriteLine(num);
//            Console.ReadLine();
//        }
//    }
//}

//namespace LambdaClosure
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            UsesClosure();
//        }

//        static void UsesClosure()
//        {
//            string toFind = "ed";
//            string[] words = { "ended", "friend", "closed", "potato" };
//            var matches = words.Select(s => s.Contains(toFind));

//            foreach (var str in matches)
//                Console.WriteLine(str);
//            Console.ReadLine();
//        }
//    }
//}

namespace LambdaCurry
{
    class Program
    {
        static void Main(string[] args)
        {
            Func<int, int, int> longLambda = (x, y) => x + y;
            Console.WriteLine(longLambda(3, 4));
            Console.ReadLine();

            // currying
            Func<int, Func<int, int>> curry1 = x => y => x + y;
            Console.WriteLine(curry1(3)(4));
            Console.ReadLine();
        }
    }
}